﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using Datos.Fabricas;
using Datos.Interfaces;
using Datos.Entidades;
using Datos.Entidades.FabricaEntidades;
using log4net;

namespace Datos.DAOSqlServer
{

    /// <summary>
    /// Clase DAO que permite el Acceso a los metodos de los evento
    /// </summary>

    public class DAOSqlServerAccesoEvento : IDAOAccesoEvento
    {


        IDAOAccesoConexion bd = FabricaConexion.DAOSqlServerAccesoConexion();

        #region Logger
        private static readonly ILog log = LogManager.GetLogger(
        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);





        #endregion 
        public DAOSqlServerAccesoEvento()
        {

        }

        /// <summary>
        /// Inserta un nuevo evento en la base de datos
        /// </summary>
        /// <param name="usuario">Evento a insertar</param>
        /// <returns>Si la creación fue exitosa o no</returns>
        public bool InsertarEvento(Entidad evento)
        {
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[INSEvento]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@Nombre", (evento as Evento).NombreEvento);
                command.Parameters.AddWithValue("@FK_Id_Categoria", (evento as Evento).FK_Id_Categoria);
                

                


                SqlDataReader reader = command.ExecuteReader();
                log.Info("Se genero la consulta");
                reader.Close();
                bd.CerrarConexionBd();
                return true;
            }
            catch (SqlException)
            {
                log.Error("Error en la consulta");
                bd.CerrarConexionBd();
                return false;
            }
            catch (Exception)
            {
                log.Error("Error en la aplicacion");
                bd.CerrarConexionBd();
                return false;
            }
        }


        /// <summary>
        /// Desactiva un nuevo evento en la base de datos
        /// </summary>
        /// <param name="usuario">Evento a desactivarr</param>
        /// <returns>Si la creación fue exitosa o no</returns>
        public bool EliminarEvento(Entidad evento)
        {
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[DELEvento]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@Id_Evento", (evento as Evento).Id_Evento);
                
                SqlDataReader reader = command.ExecuteReader();
                log.Info("Se genero la consulta");
                reader.Close();
                bd.CerrarConexionBd();
                return true;
            }
            catch (SqlException)
            {
                log.Error("Error en la consulta");
                bd.CerrarConexionBd();
                return false;
            }
            catch (Exception)
            {

                log.Error("Error en la aplicacion");
                bd.CerrarConexionBd();
                return false;
            }
        }

        /// <summary>
        /// Busca un nuevo evento en la base de datos
        /// </summary>
        /// <param name="usuario">Evento a buscar</param>
        
        public List<Entidad> BuscarEvento()
        {
            SqlCommand command = new SqlCommand();
            List<Entidad> listaevento = new List<Entidad>();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SELEvento]";
                command.CommandTimeout = 10;

                
                
                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    Entidad eventoss = FabricaEntidades.ObtenerEvento();

                    (eventoss as Evento).Id_Evento = reader.GetInt32(0);

                    (eventoss as Evento).NombreEvento = reader["NombreEvento"].ToString();

                    listaevento.Add(eventoss as Evento);
                }
                log.Info("Se genero la consulta");
                reader.Close();
                bd.CerrarConexionBd();
                return listaevento;
            }
            catch (SqlException)
            {
                log.Error("No se genero la consulta");
                bd.CerrarConexionBd();
                return null;
            }
            catch (Exception)
            {
                log.Error("No se genero la consulta");
                bd.CerrarConexionBd();
                return null;
            }
        }

        /// <summary>
        /// Busca un nuevo evento en la base de datos
        /// </summary>
        /// <param name="usuario">Evento a buscar dada una categoria</param>

        public List<Entidad> BuscarEventoCategoria(int id)
        {
            SqlCommand command = new SqlCommand();
            List<Entidad> listaevento = new List<Entidad>();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SELEventoCategoria]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@Id_Categoria", (id));

                SqlDataReader reader = command.ExecuteReader();
                
                while (reader.Read())
                {
                    Entidad eventoss = FabricaEntidades.ObtenerEvento();

                    (eventoss as Evento).Id_Evento = reader.GetInt32(0);

                    (eventoss as Evento).NombreEvento = reader["NombreEvento"].ToString();

                    listaevento.Add(eventoss as Evento);
                }
                reader.Close();
                bd.CerrarConexionBd();
                log.Info("se genero la consulta");
                return listaevento;
            }
            catch (SqlException)
            {
                log.Error("No se genero la consulta");
                bd.CerrarConexionBd();
                return null;
            }
            catch (Exception)
            {
                log.Error("Error en la aplicacion");
                bd.CerrarConexionBd();
                return null;
            }
        }

        /// <summary>
        /// Busca los participantes que pertenecen a una categoria
        /// </summary>
        /// <param name="usuario">Participante a buscar</param>
        public List<Entidad> BuscarEventoParticipante(int id)
        {
            SqlCommand command = new SqlCommand();
            List<Entidad> listaevento = new List<Entidad>();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SELEventoParticipante]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@Id_Categoria", (id));

                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    Entidad eventoss = FabricaEntidades.ObtenerParticipante();

                    (eventoss as Participante).IdParticipante = reader.GetInt32(0);

                   (eventoss as Participante).NombreParticipante = reader["Nombre"].ToString();

                    listaevento.Add(eventoss as Participante);
                }
                reader.Close();
                bd.CerrarConexionBd();
                log.Info("Se genero la consulta");
                return listaevento;
            }
            catch (SqlException)
            {
                log.Error("No se genero la consulta");
                bd.CerrarConexionBd();
                return null;
            }
            catch (Exception)
            {
                log.Error("Error en la aplicacion");
                bd.CerrarConexionBd();
                return null;
            }
        }



        /// <summary>
        /// Inserta un nuevo historial de participantes por evento en la base de datos
        /// </summary>
        /// <param name="usuario">Participante en Evento a insertar</param>
        /// <returns>Si la creación fue exitosa o no</returns>

        public bool InsertarHistorialParticipante(Entidad evento)
        {
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[INSHistorialParticipante]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@Fecha_Inicio", (evento as Evento).Fecha_Inicio);
                command.Parameters.AddWithValue("@Fecha_Fin", (evento as Evento).Fecha_Fin);
                command.Parameters.AddWithValue("@Hora", (evento as Evento).Hora);
                command.Parameters.AddWithValue("@Minuto", (evento as Evento).Minuto);
               // command.Parameters.AddWithValue("@TopeApuesta", (evento as Participante).Tope);
              //  command.Parameters.AddWithValue("@RelacionPago", (evento as Participante).Relacion);

                command.Parameters.AddWithValue("@FK_Id_Evento", (evento as Evento).FK_Id_Evento);
                command.Parameters.AddWithValue("@FK_Id_Participante", (evento as Evento).FK_Id_Participante);





                SqlDataReader reader = command.ExecuteReader();

                reader.Close();
                bd.CerrarConexionBd();
                log.Info("Se genero la consulta");
                return true;
            }
            catch (SqlException)
            {
                log.Error("Error en la consulta");
                bd.CerrarConexionBd();
                return false;
            }
            catch (Exception)
            {

                log.Error("Error en la aplicacion");
                bd.CerrarConexionBd();
                return false;
            }
        }


        /// <summary>
        /// Busca los eventos que pertenecen a un nombre
        /// </summary>
        /// <param name="usuario">evento a buscar</param>


        public Entidad BuscarEventoNombre(string nomb)
        {
            SqlCommand command = new SqlCommand();
            List<Entidad> listaevento = new List<Entidad>();
            Entidad evento1 = new Entidad();
            Entidad eventoss = FabricaEntidades.ObtenerEvento();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SELEventoNombre]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@NombreEvento", (nomb));
                
                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                  

                    (eventoss as Evento).Id_Evento = reader.GetInt32(0);

                  //  (eventoss as Evento).NombreEvento = reader["NombreEvento"].ToString();

                   // listaevento.Add(eventoss as Evento);
                }
                reader.Close();
                bd.CerrarConexionBd();
                log.Info("Se genero la consulta");
                return eventoss;
            }
            catch (SqlException)
            {
                log.Error("Error en la consulta");
                bd.CerrarConexionBd();
                return null;
            }
            catch (Exception)
            {
                log.Error("Error en la aplicacion");
                bd.CerrarConexionBd();
                return null;
            }
        }

        /// <summary>
        /// Busca los eventos en una fecha
        /// </summary>
        /// <param name="usuario">evento a buscar</param>


        public List<Entidad> BuscarEventoFecha()
        {
            SqlCommand command = new SqlCommand();
            List<Entidad> listaevento = new List<Entidad>();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[BUSEvento]";
                command.CommandTimeout = 10;

                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    Entidad eventoss = FabricaEntidades.ObtenerEvento();
                    (eventoss as Evento).Id_HistorialParticipante = reader.GetInt32(0);
                    (eventoss as Evento).NombreEvento= reader["NombreEvento"].ToString();

                    (eventoss as Evento).Fecha_Inicio = reader["Fecha_Inicio"].ToString();
                    (eventoss as Evento).Fecha_Fin = reader["Fecha_Fin"].ToString();
                    (eventoss as Evento).Hora= reader.GetInt32(4);
                    (eventoss as Evento).Minuto = reader.GetInt32(5);
             //       (eventoss as Participante).Tope = (int)reader["TopeApuesta"];
               //     (eventoss as Participante).Relacion = reader.GetInt32(6);
                  //  (eventoss as Evento).FK_Id_Categoria = reader.GetInt32(0);


                    listaevento.Add(eventoss as Evento);
                }
                reader.Close();
                bd.CerrarConexionBd();
                return listaevento;
            }
            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }
            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }
        }




        /// <summary>
        /// Modifica los eventos
        /// /// </summary>
        /// <param name="usuario">evento a modificar</param>

        public bool ModificarEvento(Entidad usuario)
        {
            SqlCommand command = new SqlCommand();
            //   string modificar = "Modificacion";
            try
            {



                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[UPDEvento]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@Id_HistorialParticipante", (int)(usuario as Evento).Id_HistorialParticipante);
                command.Parameters.AddWithValue("@Fecha_Inicio", (usuario as Evento).Fecha_Inicio);
                command.Parameters.AddWithValue("@Fecha_Fin", (usuario as Evento).Fecha_Fin);
                command.Parameters.AddWithValue("@Hora", (int)(usuario as Evento).Hora);
                command.Parameters.AddWithValue("@Minuto", (int)(usuario as Evento).Minuto);
          


                SqlDataReader reader = command.ExecuteReader();
               // log.Info("Se genero la consulta de modificarUsuario");
                reader.Close();
                bd.CerrarConexionBd();
                return true;


            }

            catch (SqlException)
            {
               // log.Error("no se ejecuto la consulta");
                bd.CerrarConexionBd();
                return false;
            }

            catch (TimeoutException)
            {
             //   log.Error("error en tiempo de ejecucion");
                bd.CerrarConexionBd();
                return false;
            }

            catch (Exception)
            {
               // log.Error("error en la aplicacion");
                bd.CerrarConexionBd();
                return false;
            }
        }
        /// <summary>
        /// Consulta un historial de evento participante 
        /// </summary>
        /// <param name="usuario">historial a buscar</param>
         public Entidad ConsultarEventoPorId(int id)
        {

            SqlCommand command = new SqlCommand();
            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[BUSEventoID]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@Id", id);

                SqlDataReader reader = command.ExecuteReader();
                Entidad evento = FabricaEntidades.ObtenerEvento();
                //Entidad rol = FabricaEntidades.ObtenerRol();
               // List<Rol> roles = new List<Rol>();
                while (reader.Read()){
                
                 //   (evento as Evento).Id_HistorialParticipante = reader.GetInt32(0);
                    (evento as Evento).Fecha_Inicio = reader["Fecha_Inicio"].ToString();
                    (evento as Evento).Fecha_Fin = reader["Fecha_Fin"].ToString();
                    (evento as Evento).Hora = reader.GetInt32(2);
                    (evento as Evento).Minuto = reader.GetInt32(3);



                   
                }
                //log.Info("Se genero ConsultarUsuarioPorId");
                reader.Close();
                bd.CerrarConexionBd();
                return evento;


            }

            catch (SqlException)
            {
               // log.Error("No se genero la consulta");
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                //log.Error("Error en la aplicacion");
                bd.CerrarConexionBd();
                return null;
            }

        }


    }
}
